﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Npgsql;
using System.Data;

namespace SIGEB.Modelo.moduloPrestamos
{
    public class conjuntoPrestamos:conjuntoBase
    {
        #region "constructores"

        public conjuntoPrestamos(datosAplicacion dA)
            : base(dA)
        {
            numTipo = CONJPRESTAMOS;
        }

        #endregion

        #region "metodos"

        public override object obtenerEstado()
        {
            throw new NotImplementedException();
        }

        #region "imec"

        public void agregarprestamo(prestamo nuevoPrest)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT registrar_prestamo('" + formatDate(nuevoPrest.fechaPrestamo) + "', '" + formatDate(nuevoPrest.fechaDevolucion) + "', '" + nuevoPrest.multaDiaria + "', 0, '" + nuevoPrest.usuarioP + "', '" + nuevoPrest.ejemplarP + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                ds.Reset();
                da.Fill(ds);
                dt = ds.Tables[0];
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al agregar Prestamo: " + nuevoPrest.codPrestamo);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch
                {

                }
            }
            notificar(this.numTipo, null);
        }

        public void eliminarprestamo(String codprestamo)
        {
            try
            {

            }
            catch
            {
                throw new Exception("Error al eliminar prestamo: " + codprestamo);
            }
        }

        public void modificarprestamo(String codprestamo, prestamo nuevoPrest)
        {
            try
            {

            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al modificar Prestamo: " + nuevoPrest.codPrestamo);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch
                {

                }
            }
            notificar(this.numTipo, null);
        }

        public void procesarDevolucion(String idEjemplar)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT procesar_devolucion('" + idEjemplar + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                ds.Reset();
                da.Fill(ds);
                dt = ds.Tables[0];
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al procesar la Devolucion.");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch
                {

                }
            }
            notificar(this.numTipo, null);
        }

        public prestamo obtenerPrestamoNumAdqui(String numAdqui)
        {
            try
            {
                prestamo nueva = null;
                try
                {
                    compConexion.Open();
                    string sql = "SELECT * FROM consultar_prestamo_ejemplar('" + numAdqui + "')";
                    NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                    // i always reset DataSet before i do something with it.... i don't know why :-)
                    ds.Reset();
                    // filling DataSet with result from NpgsqlDataAdapter
                    da.Fill(ds);
                    // since it C# DataSet can handle multiple tables, we will select first
                    dt = ds.Tables[0];
                    string[] valores;
                    foreach (DataRow row in dt.Rows)
                    {
                        valores = datosDataSet(row, 7);
                        nueva = new prestamo(valores[0], valores[6], formatDate(valores[1]), formatDate(valores[2]),
                            double.Parse(valores[3]), valores[5], int.Parse(valores[4]));
                    }
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message + "\nError al obtener los prestamos ");
                }
                finally
                {
                    try
                    {
                        compConexion.Close();
                    }
                    catch
                    {

                    }
                }
                return nueva;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener el prestamo ");
            }
            throw new NotImplementedException();
        }

        public String idPrestamo(String documento)
        {
            throw new NotImplementedException();
        }

        public LinkedList<prestamo> todosPrestamos()
        {
            LinkedList<prestamo> nueva = new LinkedList<prestamo>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_prestamo()";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 7);
                    nueva.AddLast(new prestamo(valores[0], valores[6], formatDate(valores[1]), formatDate(valores[2]),
                        double.Parse(valores[3]), valores[5], int.Parse(valores[4])));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener los prestamos ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch
                {

                }
            }
            return nueva;
        }

        public LinkedList<prestamo> todosPrestamosPendientes()
        {
            LinkedList<prestamo> nueva = new LinkedList<prestamo>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_prestamos_pendientes() AS (idPrestamo varchar(20), fechaPrestamo Date, fechaDevolucion Date, nombre text, titulo varchar(150), montoMulta float8)";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 6);
                    nueva.AddLast(new prestamo(valores[0], valores[4], formatDate(valores[1]), formatDate(valores[2]), 
                        double.Parse(valores[5]), valores[3], 0));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener los prestamos ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch
                {

                }
            }
            return nueva;
        }

        public LinkedList<prestamo> prestamoUsuarioEstado(string idUsuario, int estado)
        {
            throw new NotImplementedException();
        }

        public LinkedList<prestamo> prestamoPendienteUsuario(string idUsuario)
        {
            LinkedList<prestamo> nueva = new LinkedList<prestamo>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_prestamos_pendientes_usuario('" + idUsuario + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 7);
                    nueva.AddLast(new prestamo(valores[0], valores[6], formatDate(valores[1]), formatDate(valores[2]),
                        double.Parse(valores[3]), valores[5], int.Parse(valores[4])));
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener los prestamos ");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch
                {

                }
            }
            return nueva;
        }

        public LinkedList<prestamo> prestamosMorosos()
        {
            throw new NotImplementedException();
        }

        public LinkedList<prestamo> prestamosMorosos(string idUsuario)
        {
            throw new NotImplementedException();
        }

        public LinkedList<prestamo> prestamoFecha(DateTime desde, DateTime hasta)
        {
            throw new NotImplementedException();
        }

        #endregion

        #endregion

        #region "atributos"

        public static int ESTADOPRESTADO = 1;
        public static int ESTADODEVUELTO = 2;

        #endregion

    }
}
